home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / chasm.arc / CHASM.DOC < prev    next >
Text File  |  1983-08-01  |  61KB  |  2,641 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.                                         READ
  8.                                         THIS
  9.                                        BEFORE
  10.                                       PRINTING!!!!
  11.  
  12.  
  13.  
  14.       This document has been formated in a special way. Virtually all dot
  15.       matrix printers have a condensed mode which prints 132 characters
  16.       across a standard 8 1/2 inch page.  When this file is printed out in
  17.       condensed mode, the resulting printed pages can be cut down to 5 1/2 X
  18.       8 1/2 inches.  The cut pages will fit nicely in the back of your
  19.       DOS manual for storage.
  20.  
  21.       Typically, you can turn on this mode by sending a special control
  22.       sequence to the printer from BASIC.  For example, you can turn on the
  23.       condensed mode of the IBM/Epson printer with the BASIC statement:
  24.       LPRINT chr$(15).  If your printer has such a condensed mode, turn it
  25.       on now, before printing the rest of this document.
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.                                          (tm)
  81.                                     CHASM
  82.  
  83.                                Cheap Assembler
  84.                         for the IBM Personal Computer
  85.  
  86.                                 User's Manual
  87.                           (c) 1983 by David Whitman
  88.                               Versions 2.10/3.10
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.       David Whitman
  112.       2 North Park St. Apartment L
  113.       Hanover, NH 03755
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.                         Table of Contents
  137.  
  138.       I. Why CHASM?...............................................2
  139.  
  140.       II. What can CHASM do?......................................3
  141.  
  142.       III. What WON'T it do?......................................3
  143.  
  144.       IV. Setting Up a CHASM Work Disk............................4
  145.  
  146.       V. Modifying CHASM's I/O Defaults...........................6
  147.  
  148.       VI. Syntax..................................................9
  149.  
  150.       VII. Operands..............................................11
  151.  
  152.       VIII. Resolution of Ambiguities............................15
  153.  
  154.       IX. Pseudo-Operations......................................18
  155.  
  156.       X. Outside the Program Segment.............................21
  157.  
  158.       XI. Running CHASM..........................................22
  159.  
  160.       XII. Error and Diagnostic Messages.........................24
  161.  
  162.       XIII. Execution of Assembled Programs......................27
  163.  
  164.       XIV. Notes for Those Upgrading to This Version of CHASM....31
  165.  
  166.       XV. Miscellaneous and A Word From Our Sponsor..............34
  167.  
  168.       XIV. Compiled Version Order Form...........................37
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.                                                                       2
  201.  
  202.       I. Why Chasm?
  203.  
  204.       Why go to the trouble to write an assembler, when one already
  205.       exists?  The IBM Macro Assembler is a very powerful software tool
  206.       available off the shelf.  It supports features such as macros,
  207.       definition of multiple segments, and linking to external
  208.       procedures.
  209.  
  210.       Unfortunately, all of this power doesn't fit into a 64K machine,
  211.       and even when using the small subset version, 64K users are
  212.       limited by memory to only very small programs.  The macro
  213.       assembler is also very complex, hard to understand, and costs a
  214.       hundred bucks.
  215.  
  216.       Even though the price of memory keeps dropping, I suspect
  217.       that the majority of the IBM PC's out there have no more than 64K
  218.       installed.  Also, I suspect that most end-user assembly language
  219.       programmers are like myself, and are not interested in writing
  220.       huge, complicated programs in assembler.  I want to write short
  221.       subroutines to call from BASIC, small patches to existing
  222.       assembler programs (such as DOS), and perhaps some games.  For
  223.       such uses, I think the combination of the Macro Assembler and a
  224.       tub full of extra memory represents an incredible overkill. Chasm
  225.       is, I hope, a more reasonable compromise between power and
  226.       accessibility (both in cost and complexity).
  227.  
  228.       A Note for Beginners:
  229.  
  230.       CHASM is much easier to use than the IBM macro assembler, and is
  231.       ideal for learning assembly language.  If you consider yourself a
  232.       beginner, you might find it useful to print out and read the file
  233.       PRIMER.DOC which is included on your CHASM distribution disk.
  234.       PRIMER is a gentle introduction to assembly language programming,
  235.       which will teach you some of the vocabulary and key concepts you
  236.       will need to start out with.
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.                                                                       3
  267.  
  268.  
  269.       II. What can Chasm do?
  270.  
  271.       Chasm takes a text file, consisting of mnemonics, user-defined
  272.       symbols, numbers, and pseudo-ops, and produces a file of
  273.       corresponding machine language for the 8088 processor.  Chasm
  274.       allows you to define labels for branching, rather than requiring
  275.       you to figure out offsets or addresses to jump to.  It allows you
  276.       to represent with a name any constants you want to use, making
  277.       your programs easier to understand.  Most importantly, it
  278.       translates mnemonics to their machine language equivalents
  279.       freeing you from the task of hand translation.
  280.  
  281.       III. What WON'T it do?
  282.  
  283.       In the interest of simplicity, Chasm has a number of
  284.       restrictions:
  285.  
  286.       1. Statement syntax is not quite as free as in the macro
  287.          assembler.
  288.  
  289.       2. The number of pseudo-ops is severely cut down from the macro
  290.          assembler.
  291.  
  292.       3. Macros are not supported.  (Note that the IBM assembler doesn't
  293.          support macros in systems smaller than 96K)
  294.  
  295.       4. Expressions (such as BUFFER - 2 ) are not supported, at least
  296.          in version 1.0.
  297.  
  298.       5. Multiple segment definitions are not allowed, at least in
  299.          version 1.0.  Chasm assumes that your entire program fits in
  300.          one segment, that the cs, ds, and es registers all point to
  301.          this same segment, and that the ss register points to a valid
  302.          stack area.
  303.  
  304.       6. External linking is not supported, at least in version 1.0.
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.                                                                       4
  333.  
  334.       IV. SETTING UP A CHASM WORK DISK
  335.  
  336.       CHASM comes in two flavors: interpreted and compiled.  You can
  337.       tell which version you have by listing the directory of your
  338.       CHASM distribution disk.  If the file CHASM.EXE is present, you
  339.       have the compiled version.  If not, you have the interpreted
  340.       version.  Follow the appropriate instructions below to make a
  341.       CHASM work disk:
  342.  
  343.       Compiled version:
  344.  
  345.       Format a fresh diskette with the /S option (to include DOS). Now
  346.       copy the following files from your CHASM distribution disk:
  347.  
  348.          CHASM.EXE
  349.          CHASM.DAT
  350.  
  351.       Interpreted version:
  352.  
  353.       Format a fresh diskette with the /S option (to include DOS). From
  354.       your master DOS diskette, copy the file:
  355.  
  356.          BASIC.COM
  357.  
  358.       Now copy the following files from your CHASM distribution disk:
  359.  
  360.          CHASM.BAT
  361.          CHASM.BAS
  362.          CHASM.DAT
  363.          CHASM.OVL
  364.  
  365.       Both versions:
  366.  
  367.       The file CLEAR.ASM on your CHASM distribution disk is provided as
  368.       a sample assembly language source file.  If you want to try out
  369.       CHASM before writing a source program of your own, copy CLEAR.ASM
  370.       onto your work disk.
  371.  
  372.       If you wish to modify any of CHASM's I/O defaults, you should
  373.       include a CHASM.CFG file on your work disk.  See section VII for
  374.       a discussion of the CHASM.CFG file.
  375.  
  376.       You may find it convenient to keep a copy of your text editor
  377.       (EDLIN, VEDIT, etc.) on your work diskette, for creation and
  378.       modification of source files.
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.                                                                       5
  399.  
  400.  
  401.       If you plan to incorporate machine language routines in BASIC
  402.       programs, copy the utility program COM2DATA (file COM2DATA.EXE or
  403.       COM2DATA.BAS) from your CHASM distribution disk.
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.                                                                       6
  465.  
  466.       V. MODIFYING CHASM'S I/O DEFAULTS
  467.  
  468.       CHASM supports the use of a configuration file, which can be used
  469.       to override some of CHASM's default assumptions about your printer
  470.       and video monitor.  If you are willing to accept CHASM's
  471.       defaults, you may skip this section - CHASM will work perfectly
  472.       well without the file described below.
  473.  
  474.       The configuration process involves supplying a file named
  475.       CHASM.CFG on your work disk.  The file should contain a series of
  476.       text "switches" of the following form:
  477.  
  478.       /switch, nn, [mm, oo,...]
  479.  
  480.       Where "/switch" is a reserved word, listed below, and nn, mm, oo
  481.       are numbers.  The brackets around mm and oo indicate that these
  482.       numbers are optional - don't put brackets in CHASM.CFG. Each
  483.       number or word should be separated by a comma or should start a
  484.       new line.
  485.  
  486.       The following switches are implemented:
  487.  
  488.       /132        Printer 132 column mode.  The numbers following this
  489.                   switch are the ASCII codes for the characters which
  490.                   cause your printer to go into condensed mode.  You
  491.                   may specify as many characters as you like.  If you
  492.                   don't provide this switch, CHASM will truncate source
  493.                   lines in listings to avoid going over 80 columns.
  494.                   Example: (for IBM printer)
  495.  
  496.                   /132, 15
  497.  
  498.       /80         Printer 80 column mode.  Similar to /132, but the
  499.                   numbers represent the characters to return your
  500.                   printer to normal.  Example: (IBM printer again)
  501.  
  502.                   /80, 18
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.                                                                       7
  531.  
  532.       /BEEP       Enables/Disables audible warning when errors are
  533.                   discovered in your source program.  A value of zero
  534.                   turns off beeping, anything else turns it on.
  535.                   Example: (off)
  536.  
  537.                   /BEEP, 0
  538.  
  539.       /FG         Foreground color.  Users with color monitors may
  540.                   select a foreground color from the following list:
  541.  
  542.                   0    Black               8    Gray
  543.                   1    Blue                9    Light Blue
  544.                   2    Green              10    Light Green
  545.                   3    Cyan               11    Light Cyan
  546.                   4    Red                12    Light Red
  547.                   5    Magenta            13    Light Magenta
  548.                   6    Brown              14    Yellow
  549.                   7    White              15    High Intensity White
  550.  
  551.                   Example: (Magenta)
  552.  
  553.                   /FG, 5
  554.  
  555.       /BG         Background color.  Selections 0-7 above are
  556.                   available. Example: (Cyan)
  557.  
  558.                   /BG, 3
  559.  
  560.  
  561.       /PAGELEN    CHASM assumes that there are 66 lines to each
  562.                   printed page.  If you use non-standard paper, enter
  563.                   the appropriate number after this switch.
  564.                   Example:
  565.  
  566.                   /PAGELEN, 72
  567.  
  568.       /LINES      By default, CHASM will print 58 lines on each printed
  569.                   page, then skip over the perforation to the next
  570.                   page.  You can change this number to suit your paper
  571.                   and personal taste.  Example:
  572.  
  573.                   /LINES, 50
  574.  
  575.       A sample CHASM.CFG file, suitable for use with the IBM dot matrix
  576.       printer, is included on your CHASM distribution disk.
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.                                                                       8
  597.  
  598.  
  599.       Note for users of Jim Button's PC-FILE (tm):
  600.  
  601.          CHASM.CFG has the same format as PC-FILE's PRT.CTL file,
  602.          except that the /40 switch is not implemented.  If you have
  603.          already written a special PRT.CTL file, just make a copy named
  604.          CHASM.CFG for use with CHASM.
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.                                                                       9
  663.  
  664.       VI. Syntax
  665.  
  666.       Chasm accepts a standard DOS text file for input.  Lines may be
  667.       any combination of upper and lower case characters.  Chasm does
  668.       not distinguish between the two cases: everything except single
  669.       quoted strings are automatically converted to upper case during
  670.       the parsing process.  Thus, BUFFER, Buffer, buffer, and bUFFer
  671.       all refer to the same symbol.
  672.  
  673.       The characters  blank ( ), comma (,), single quote (')
  674.       semi-colon (;) and TAB are reserved, and have special meaning to
  675.       Chasm (see below).
  676.  
  677.       Note also that Chasm is written in BASIC, and use of the double
  678.       quote character (") may cause bizarre effects by confusing the
  679.       interpreter into breaking down input lines in an undesirable way.
  680.       The double quote may be safely represented in a text message by
  681.       declaring a byte containing its ASCII value.  Thus, to represent
  682.       the text:
  683.  
  684.          Use ASCII value for "double quotes"
  685.  
  686.       You may use:
  687.  
  688.          DB 'Use ASCII value for ' 22H 'double quotes' 22H
  689.  
  690.       Each line must be less than 256 characters long and have the
  691.       following format:
  692.  
  693.          Label Operation Operand(s) ;comment
  694.  
  695.       The different fields of an input line are separated by the
  696.       delimiters blank ( ), comma (,) or TAB.  Any number of any
  697.       delimiter may be used to separate fields.
  698.  
  699.       Explanation of Fields:
  700.  
  701.       Label: A label is a string of characters, beginning in column 1.
  702.          Depending on the operation field, the label might represent a
  703.          program location for branching, a memory location, or a
  704.          numeric constant.  Note that anything beginning in column 1,
  705.          except a comment, is considered a label.
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.                                                                      10
  729.  
  730.       Operation: Either a pseudo-op (see section IX)
  731.          or an instruction mnemonic as defined in "The 8086 Book" by
  732.          Rector and Alexy.
  733.  
  734.          Note 1: Except as modified below,"The 8086 Book" is the
  735.             definitive reference for use with Chasm.
  736.  
  737.          Note 2: There are several ways to resolve some ambiguities in
  738.             8086 assembly language.  Please read page 3-285 of The 8086
  739.              Book, and section VIII of this document.
  740.  
  741.       Operand(s): A list of one or more operands, as defined in section
  742.          VI, separated by delimiters.
  743.  
  744.       Comment: Any string of characters, beginning with a semicolon
  745.          (;). Anything to the right of a semicolon will be ignored by
  746.          Chasm.
  747.  
  748.       Note that except for the case of an operation which requires
  749.       operands, or the EQU pseudo-op which requires a label, all of the
  750.       fields are optional.  The fields MUST appear in the order shown.
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.                                                                      11
  795.  
  796.       VII. Operands
  797.  
  798.       The following operand types are allowed.
  799.  
  800.       1. Immediate data: A number, stored as part of the program's
  801.          object code.  Immediate data are classified as either byte,
  802.          expressible as an 8 bit binary integer; or word, expressible
  803.          as a 16 bit binary integer.  If context requires it, CHASM
  804.          will left-pad byte values with zeroes to convert them to word
  805.          values.  Attempts to use a word value where only a byte will
  806.          fit will cause an error message to be printed.
  807.  
  808.          Immediate data may be represented in 5 ways:
  809.  
  810.             A. An optionally signed decimal number in the range -32768
  811.                to 32767.  Examples:
  812.  
  813.                MOV AL,21
  814.                MOV BX,-6300
  815.  
  816.             B. A series of up to 4 hex digits, followed by the letter
  817.                H.  The first digit must be non-alphabetic, i.e. in the
  818.                range 0-9, to allow CHASM to distinguish between numbers
  819.                and symbols. If necessary, a leading zero, which does
  820.                not count in the four allowed digits, may be added to
  821.                fufill the non-alphabetic condition. Examples:
  822.  
  823.                ADD CX, 0B123H
  824.                ADD DL, 12H
  825.  
  826.             C. A symbol representing types A or B above, defined using
  827.                the EQU pseudo-op.  Examples:
  828.  
  829.                MASK EQU 10H
  830.                MAX  EQU 1000
  831.                     AND  CL,MASK
  832.                     SUB  AX,MAX
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.                                                                      12
  861.  
  862.             D. The offset of a label or storage location returned by
  863.                the OFFSET operator.  OFFSET always returns a word
  864.                value. OFFSET is used to get the address of a named
  865.                memory location, rather than its contents.  Example:
  866.  
  867.                       MOV DI,OFFSET(BUFFER)
  868.                BUFFER DS  0FFH
  869.  
  870.             E. The ASCII value of a printable character, represented by
  871.                the character enclosed in single quotes (').  Thus, the
  872.                following lines will generate the same object code:
  873.  
  874.                MOV AL,41H  ;ascii code for 'A'
  875.                MOV AL,'A'
  876.  
  877.       2. Register Operands: One of the 8088's internal registers.
  878.  
  879.          A. An 8 bit register from the following list:
  880.             AH    AL
  881.             BH    BL
  882.             CH    CL
  883.             DH    DL
  884.  
  885.          B. A 16 bit register from the following list:
  886.             AX   BX   CX   DX   SP   BP   SI   DI
  887.  
  888.          C. A segment register from the following list:
  889.             CS   SS   DS   ES
  890.  
  891.       3. Memory Operands: The contents of a memory location addressed
  892.          by one of the following methods.  Note that none of the memory
  893.          addressing options specifies whether a byte or word operand
  894.          is being referenced.  See section VIII for more on this
  895.          topic.
  896.  
  897.          A. Direct address.
  898.  
  899.             1. A number, or symbol representing a number, enclosed in
  900.                brackets, indicating an offset into the data segment.
  901.                Example:
  902.  
  903.                BUFFER EQU 5A5AH
  904.                       MOV BH,[BUFFER]
  905.                       MOV [80H],DI
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.                                                                      13
  927.  
  928.             2. A symbol, defined to be a variable (i.e. a named memory
  929.                location) using the EQU pseudo-op.  Example:
  930.  
  931.                FCB EQU [80H]
  932.                    MOV DI,FCB
  933.  
  934.             3. A symbol, defined to be a variable by its use on a
  935.                storage defining pseudo-op.  Examples:
  936.  
  937.                     MOV AX,FLAG
  938.                     MOV DATE,BX
  939.                FLAG DS 1
  940.                DATE DB 31
  941.  
  942.          B. Indirect Address:  The address of the operand is the
  943.             sum of the contents of the indicated register(s) and a
  944.             displacement.  The register, or sum of registers, are
  945.             enclosed in square brackets: []
  946.  
  947.             The displacement is optional, and takes the form of an
  948.             immediate operand, placed without intervening delimiters to
  949.             the left of the first bracket.  Displacements in the range
  950.             -128 to 127 (i.e. hex 0 - 7F, FF80 - FFFF) are interpreted
  951.             as signed 8 bit quantities.  All other displacements are
  952.             interpreted as unsigned 16 bit quantities.  (Note that
  953.             although the 8088 supports unsigned 16 bit displacements up
  954.             to hex FFFF for indirect addressing, Chasm isn't smart
  955.             enough to distinguish between -1 and FFFFH.)
  956.  
  957.             The following indirect modes are allowed:
  958.  
  959.             1. Indirect through a base register (BX or BP).  Examples:
  960.  
  961.                ENTRYLENGTH EQU 6
  962.                            MOV AX, ENTRYLENGTH[BP]
  963.                            MOV DL, -2[BX]
  964.                            MOV CX, [BP]
  965.                            MOV 9A9AH[BX], AX
  966.  
  967.             2. Indirect through an index register (DI or SI).
  968.                Examples:
  969.  
  970.                MOV [DI], CX
  971.                MOV CX, -5[SI]
  972.  
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979.  
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  
  992.                                                                      14
  993.  
  994.             3. Indirect through the sum of one base register and one
  995.                index register.  Examples:
  996.  
  997.                MOV [BP+DI], SP      ;note that no spaces are
  998.                MOV BX, 10H[BX+SI]   ;allowed within the
  999.                MOV CL, [BP+SI]      ;brackets.
  1000.                MOV DH, -2[BX+DI]
  1001.  
  1002.       4. Labels
  1003.  
  1004.          A label on an instruction may be used as an operand for
  1005.          call and jump instructions.  Examples:
  1006.  
  1007.          START    PROC NEAR
  1008.                   CALL GETINPUT
  1009.                   JMPS START
  1010.                   ENDP
  1011.          GETINPUT PROC NEAR
  1012.  
  1013.       5. Strings
  1014.  
  1015.          A string is any sequence of characters (including delimiters)
  1016.          surrounded by single quotes (').  Example:
  1017.  
  1018.          DB 'Copyright May 15,1982'
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.                                                                      15
  1059.  
  1060.       VIII. Resolution of Ambiguities.
  1061.  
  1062.       The language defined in "The 8086 Book" contains a number of
  1063.       ambiguities which must be resolved by an assembler.  This is
  1064.       discussed throughout the book, but pages 3-285 and 3-286
  1065.       specifically cover this topic.  Chasm's solutions of these
  1066.       problems are discussed in this section.
  1067.  
  1068.       A. Memory references:
  1069.  
  1070.       When one specifies the address of a memory location, it is
  1071.       unclear how large an operand is being referenced.  An operand
  1072.       might be a byte, or a word.
  1073.  
  1074.          1. If a register is present as an operand, it is assumed that
  1075.             the memory operand matches the register in size.  An
  1076.             exception to this rule are the shift and rotate
  1077.             instructions, where the CL register is used as a counter,
  1078.             and has nothing to do with the size of the other operand.
  1079.             Examples:
  1080.  
  1081.             MOV MASK,AX   ;mask is a word
  1082.             MOV DH,[BX]   ;BX points to a byte
  1083.             NEG [SI]      ;error, operand of unknown size
  1084.             SHR FLAG,CL   ;error, flag is of unknown size
  1085.  
  1086.          2. If no register is present, (or if the only register is CL
  1087.             being used as a counter) the size of the memory operand is
  1088.             specified by adding the suffix "B" or "W" to the
  1089.             instruction mnemonic.  Examples:
  1090.  
  1091.             NEGB [SI]       ;SI points to a byte
  1092.             SHRW FLAG,CL    ;flag is a word
  1093.             MOVW MASK,0AH   ;mask is a word
  1094.             MOVB MASK,0AH   ;mask is a byte
  1095.             MOVW MASK,9A9AH ;must specify size even though
  1096.                             ;immediate operand implies word
  1097.             MOVB DH,[BX]    ;error(!), register already
  1098.                             ;specifies size
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.                                                                      16
  1125.  
  1126.       B. Indirect Branching.
  1127.  
  1128.       The 8088 supports two flavors of indirect branching: intra, and
  1129.       intersegment.  A register is set to point at a memory location
  1130.       which contains a new value for the program counter, and in the
  1131.       case of intersegment branching, a new value for the CS register
  1132.       as well.
  1133.  
  1134.       The syntax of "The 8086 Book" does not specify which flavor of
  1135.       branch is being invoked.  Chasm adds the suffixes "N" (for near,
  1136.       or intrasegment) and "F" (for far, or intersegment) to the
  1137.       indirect CALL and JMP mnemonics.  Examples:
  1138.  
  1139.          CALLN [BX]    ;intrasegment call
  1140.          JMPF  [DI]    ;intersegment jump
  1141.          JMP   [BP]    ;error, unspecified flavor
  1142.  
  1143.       C. Long and Short Jumps
  1144.  
  1145.       Two types of relative jumps are supported by the 8088: short
  1146.       (specified by a signed 8 bit displacement) and long (specified by
  1147.       a 16 bit displacement).  Both are implemented in Chasm as a jump
  1148.       to a label.
  1149.  
  1150.       The short jump is specified by mnemonic JMPS, in accord with the
  1151.       IBM disassembler, but not with The 8086 Book, which uses JMP.
  1152.       Since one of the displacement bits is used to indicate direction,
  1153.       only seven are left to express the magnitude of jump.  JMPS (and
  1154.       similarly, all the jump on condition instructions) is thus
  1155.       limited to branching to labels within a range of -128 to +127
  1156.       bytes.
  1157.  
  1158.       Chasm reserves mnemonic JMP for the long jump.  JMP may be used
  1159.       to jump anywhere within the program segment, but the object code
  1160.       generated is less compact than that from JMPS.
  1161.  
  1162.       Examples:
  1163.  
  1164.          START PROC NEAR
  1165.                JMPS END     ;short jump
  1166.                JMP  START   ;long jump
  1167.          END   ENDP
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.                                                                      17
  1191.  
  1192.       D. Instruction Prefixes.
  1193.  
  1194.       The 8088 supports three instruction prefixes:
  1195.  
  1196.          1. SEG: segment override. An alternate segment register is
  1197.             specified for a reference to memory
  1198.  
  1199.          2. REP, REPE,REPNE,REPZ,REPNZ: repeat. A string primitive is
  1200.             repeated until a condition is met.
  1201.  
  1202.          3. LOCK: Turns on the LOCK signal. Only useful in
  1203.             multiprocessor situations.
  1204.  
  1205.       Chasm implements these prefixes as separate instructions, rather
  1206.       than prefixes to another instruction.  They appear on a separate
  1207.       line, immediately before the instruction which they modify.  This
  1208.       is in accord with the output of the IBM disassembler, but not
  1209.       with the IBM macro assembler.  Examples:
  1210.  
  1211.          SEG ES
  1212.          MOV AX,FLAG  ;flag is in the extra segment
  1213.          REP
  1214.          MOVSB        ;move bytes until CX decremented to 0
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.                                                                      18
  1257.  
  1258.       IX. Pseudo-Operations
  1259.  
  1260.       The following pseudo-ops are implemented:
  1261.  
  1262.       A. BSAVE: Generate object code in BSAVE format.
  1263.  
  1264.          Instructs CHASM to build a header in the format of BASIC's
  1265.          BSAVE command.  The resulting object code file may be BLOADed
  1266.          by BASIC programs.  No operands are required, and the
  1267.          pseudo-op may appear anywhere within the source code.
  1268.          Example: 
  1269.  
  1270.                ORG    0     ;no psp
  1271.          SUBRT PROC   FAR   ;subroutine for BASIC program
  1272.                BSAVE        ;make BLOADable object file
  1273.  
  1274.       B. DB: Declare Bytes
  1275.  
  1276.          Memory locations are filled with values from the operand list.
  1277.          Any number of operands may appear, but all must fit on one
  1278.          line.  Acceptable operands are numbers between 0 and FFH
  1279.          (0-255 decimal), or strings enclosed in single quotes (').  If
  1280.          a label appears, it is considered a variable, and the location
  1281.          may be referred to using the label, rather than an address.
  1282.          Examples:
  1283.  
  1284.                MOV AX,MASK
  1285.          MASK  DB  00H,01H
  1286.          STG   DB  'A string operand'
  1287.  
  1288.       C. DS: Declare Storage
  1289.  
  1290.          Used to declare large blocks of identically initialized
  1291.          storage.  The first operand is required, a number specifying
  1292.          how many bytes are declared.  If a second operand in the form
  1293.          of a number 0-FFH appears, the locations will all be
  1294.          initialized to this value.  If the second operand is not
  1295.          present, locations are initialized to 0.   As with DB, any
  1296.          label is considered a variable.  To save space, the object
  1297.          code does not appear on the listing.  Examples:
  1298.  
  1299.             DS 10         ;10 locs initialized to 0
  1300.             DS 100H,1AH   ;256 locs initialized to 1AH
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.                                                                      19
  1323.  
  1324.       D. EJECT: Begin New Print Page
  1325.  
  1326.          Causes CHASM to move to the top of the next page in printed
  1327.          listings.  Has no effect on listings sent to the screen or to
  1328.          disk.
  1329.  
  1330.       E. ENDP: End of Procedure
  1331.  
  1332.          See PROC (below) for details.
  1333.  
  1334.       F. EQU: Equate
  1335.  
  1336.          Used to equate a symbolic name with a number. The symbol may
  1337.          then be used anywhere the number would be used.  Use of
  1338.          symbols makes programs more understandable, and simplifies
  1339.          modification.
  1340.  
  1341.          An alternate form of EQU encloses the number in square
  1342.          brackets: []. The symbol is then interpreted as a variable,
  1343.          and may be used as an address for memory access.  This version
  1344.          is provided to allow symbolic reference to locations outside
  1345.          the program segment. Examples:
  1346.  
  1347.             MOFFSET    EQU 0B000H
  1348.             MONOCHROME EQU [0000H]
  1349.  
  1350.          Warning: Difficult to debug errors may result from using a
  1351.          symbol prior to its being defined by EQU.  I strongly urge
  1352.          that all equates be grouped together at the beginning of
  1353.          programs, before any other instructions. See "Phase Error" in
  1354.          section XII.
  1355.  
  1356.       G. ORG: Origin
  1357.  
  1358.          Allows direct manipulation of the location counter during
  1359.          assembly.  By default, Chasm assembles code to start at offset
  1360.          100H, thus leaving room for the program segment prefix
  1361.          normally built by COMMAND or DEBUG.  In situations where no
  1362.          PSP is provided, such as routines to be called from BASIC, you
  1363.          should override this default with ORG, or incorrect assembly
  1364.          may result.
  1365.  
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.                                                                      20
  1389.  
  1390.          ORG requires one operand, a number between 0 and 32767, which
  1391.          represents the new setting of CHASM's location counter.
  1392.          Although the location counter may be reset anywhere within a
  1393.          program, generally this pseudo-op should be used before any
  1394.          machine executable instructions for meaningful results.
  1395.  
  1396.          Example:
  1397.  
  1398.            ORG 0   ;Code will be assembled for starting
  1399.                    ;offset of 0
  1400.  
  1401.       H. PROC ...ENDP: Procedure Definition
  1402.  
  1403.          Declares a procedure.  One operand is required on PROC, either
  1404.          the word NEAR, or the word FAR.  This pseudo-op warns Chasm
  1405.          whether to assemble returns as intra (near) or intersegment
  1406.          (far).  Procedures called from within your program should be
  1407.          declared NEAR.  All others should be FAR.  ENDP terminates the
  1408.          procedure, and requires no operands.  If a RET is encountered
  1409.          outside of a declared procedure, an error occurs.  Procedures
  1410.          may be nested, up to 10 deep.  Example:
  1411.  
  1412.          MAIN  PROC  FAR
  1413.                ...
  1414.                ...      ;body of procedure
  1415.                ENDP
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.                                                                      21
  1455.  
  1456.       X. Outside the Program Segment
  1457.  
  1458.       As mentioned previously, Chasm does not support multiple segment
  1459.       definitions.  Provision is made for limited access outside of the
  1460.       program segment, however.
  1461.  
  1462.       A. Memory References
  1463.          To access memory outside the program segment, you simply move
  1464.          a new segment address into the DS register, then address using
  1465.          offsets in the new segment.  The memory option of the EQU
  1466.          pseudo-op allows you to give a variable name to offsets in
  1467.          other segments. For example, to access the graphics character
  1468.          table in ROM:
  1469.  
  1470.             BIOS       EQU  0F000H
  1471.             CHARTABLE  EQU  [0FA6EH]
  1472.                        MOV  AX,BIOS      ;can't move immed. to DS
  1473.                        MOV  DS,AX
  1474.                        MOV  AL,CHARTABLE ;1st byte of char. table
  1475.  
  1476.       B. Code Branching
  1477.  
  1478.          Chasm supports 4 instructions for branching outside the program
  1479.          segment.
  1480.  
  1481.          1. Direct CALL and JMP
  1482.  
  1483.             New values for the PC and CS registers are included in the
  1484.             instruction as two immediate operands.  Example:
  1485.  
  1486.             BIOS         EQU  0F000H            ;RAM bios segment
  1487.             DISKETTE_IO  EQU  0EC59H            ;disk handler
  1488.                          JMP  DISKETTE_IO,BIOS
  1489.  
  1490.          2. Indirect CALLF and JMPF
  1491.  
  1492.             Four consecutive bytes in memory are initialized with new
  1493.             values for the PC and CS registers.  The CALLF or JMPF then
  1494.             references the address of the new values.  Example:
  1495.  
  1496.             BIOS        EQU   0F000H           ;RAM bios segment
  1497.             PRINTER_IO  EQU   0EFD2H           ;printer routine
  1498.                         MOV   [DI],PRINTER_IO
  1499.                         MOV   2[DI],BIOS
  1500.                         CALLF [DI]
  1501.  
  1502.  
  1503.  
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.                                                                      22
  1521.  
  1522.       XI. Running Chasm
  1523.  
  1524.       From DOS, type:
  1525.  
  1526.          CHASM
  1527.  
  1528.       After a few seconds, Chasm prints a hello screen, then prompts:
  1529.  
  1530.          Hit any key to continue...
  1531.  
  1532.       Chasm prompts:
  1533.  
  1534.          Source code file name? [.asm]
  1535.  
  1536.       Type in the name of the file which contains your program.  If you
  1537.       do not include an extension for the filename, Chasm assumes it to
  1538.       be .ASM.  If Chasm is unable to find the file, it will give you
  1539.       the option of naming another file, or returning to DOS.
  1540.  
  1541.       Assuming your file is present, Chasm prompts:
  1542.  
  1543.          Direct listing to Printer (P), Screen (S), or Disk (D)?
  1544.  
  1545.       Respond with either an upper or lower case letter. If you select
  1546.       "D", Chasm will prompt:
  1547.  
  1548.          Name for listing file? [fname.lst]
  1549.  
  1550.       Type in a name for the listing file.  If you just press ENTER,
  1551.       the name defaults to that of your source file, with an extension
  1552.       of .LST.
  1553.  
  1554.       The final prompt is:
  1555.  
  1556.          Name for object file? [fname.com]
  1557.  
  1558.       Type in a name for the assembled program.  If you just press
  1559.       ENTER, the name defaults to that of your source file, with an
  1560.       extension of .COM.
  1561.  
  1562.  
  1563.  
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569.  
  1570.  
  1571.  
  1572.  
  1573.  
  1574.  
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.                                                                      23
  1587.  
  1588.       Chasm now assembles your program.  A status line is maintained on
  1589.       the screen, showing how many lines have been processed.  Chasm
  1590.       makes two passes over your source file, outputting the listing
  1591.       and object code on the second pass.  Be patient, Chasm is written
  1592.       in BASIC, and does a good imitation of a snail crawling through
  1593.       molasses.
  1594.  
  1595.       ****NOTE: I will send the Golden Bootstrap Award to the first
  1596.          person submitting a complete implementation of Chasm,
  1597.          rewritten in assembly language, and small enough to be
  1598.          assembled by Chasm version 1.9 on a 64K system.
  1599.  
  1600.       When finished, Chasm returns you to DOS, and you see the prompt:
  1601.  
  1602.          A>
  1603.  
  1604.  
  1605.  
  1606.  
  1607.  
  1608.  
  1609.  
  1610.  
  1611.  
  1612.  
  1613.  
  1614.  
  1615.  
  1616.  
  1617.  
  1618.  
  1619.  
  1620.  
  1621.  
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635.  
  1636.  
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.                                                                      24
  1653.  
  1654.       XII. Error and Diagnostic Messages
  1655.  
  1656.       Error messages generated on pass one appear on the listing before
  1657.       any source code is printed, and mention the line number to which
  1658.       they refer.  The majority of messages occur during pass two, and
  1659.       will appear in the listing immediately prior to the line which
  1660.       caused the message.
  1661.  
  1662.       Add Leading Zero to Hex Constant: Diagnostic.  The Unrecognized
  1663.          Symbol could be interpreted as a hexadecimal number if a
  1664.          leading zero was added.
  1665.  
  1666.       Could Use JMPS: Diagnostic.  The specified label requires an
  1667.          offset of less than 128 bytes; specifying the short jump would
  1668.          result in more compact code.  The assembled code is correct,
  1669.          however.
  1670.  
  1671.       Duplicate Definition of XXX in (linenum): Pass 1 error.  An
  1672.          attempt was made to define a symbol already present in the
  1673.          symbol table.
  1674.  
  1675.       ENDP without PROC: An ENDP was encountered, but no corresponding
  1676.          PROC was found.
  1677.  
  1678.       EQU Without Label: No symbol was found to equate with the
  1679.          operand.
  1680.  
  1681.       Illegal or Undefined Argument for Offset: The argument for the
  1682.          Offset function was not present in the symbol table as a near
  1683.          label or memory location on pass 2.
  1684.  
  1685.       Missing ENDP: The end of the input file was encountered, and at
  1686.          least one PROC had not been terminated by an ENDP.
  1687.  
  1688.       Phase Error: A near label or memory location is found to have
  1689.          different values on pass 1 and pass 2.  A difficult to debug
  1690.          error: generally the problem is not caused by the statement
  1691.          which received the error message.
  1692.  
  1693.  
  1694.  
  1695.  
  1696.  
  1697.  
  1698.  
  1699.  
  1700.  
  1701.  
  1702.  
  1703.  
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.  
  1711.  
  1712.  
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.                                                                      25
  1719.  
  1720.          The only documented way to generate this error is by using a
  1721.          symbol prior to defining it using EQU.  On pass 1, Chasm
  1722.          assumes that unrecognized symbols are either labels or memory
  1723.          addresses which will be defined later in the program.  If the
  1724.          symbol is subsequently defined as immediate data, the location
  1725.          counter may get messed up.  I would appreciate hearing about
  1726.          any other situations which cause this message to appear.
  1727.  
  1728.       Procedures Nested Too Deeply: Procedures may be nested no more
  1729.          than 10 deep.
  1730.  
  1731.       Specify Word or Byte Operation: Diagnostic.  Chasm suggests that
  1732.          the Syntax Error might be resolved by adding the suffix "B" or
  1733.          "W" to the instruction mnemonic.  Most, but not all, ambiguous
  1734.          memory references are flagged with this diagnostic.
  1735.  
  1736.       Syntax Error: (OP) (DTYPE) (STYPE).  Chasm was unable to find a
  1737.          version of the instruction (OP) which allows the operand types
  1738.          (DTYPE) and (STYPE).  Either the instruction doesn't exist, or
  1739.          it is an inappropriate choice for the given operands.  DTYPE
  1740.          and STYPE are numbers which encode Chasm's guess as to what
  1741.          the 1st and 2nd operands might be. The numbers are sums of the
  1742.          types given in the following list:
  1743.  
  1744.              1 = 8 bit accumulator            2 = 16 bit accumulator
  1745.              4 = 8 bit register               8 = 16 bit register
  1746.             16 = indirect memory reference   32 = CS register
  1747.             64 = other segment register     128 = memory location
  1748.            256 = immediate byte             512 = immediate word
  1749.           1024 = none                      2048 = string
  1750.           4096 = near label                8192 = reserved
  1751.          16384 = CL (count) register
  1752.  
  1753.       Too Far For Short Jump: The displacement to the specified label
  1754.          is not in the range -128 to +127.
  1755.  
  1756.       Too Many User Symbols in (linenum): Pass one error.  The symbol
  1757.          table is full.
  1758.  
  1759.       Undefined Operand for EQU: Any operands on an EQU statement must
  1760.          have been previously defined.
  1761.  
  1762.       Undefined Symbol XXX: The symbol XXX was used as an operand, but
  1763.          never appeared as a label, and is not a predefined symbol.
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.  
  1770.  
  1771.  
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.                                                                      26
  1785.  
  1786.       Unrecognized Operand XXX: XXX is used in the DB operand list, but
  1787.          is not a string or byte value.
  1788.  
  1789.  
  1790.  
  1791.  
  1792.  
  1793.  
  1794.  
  1795.  
  1796.  
  1797.  
  1798.  
  1799.  
  1800.  
  1801.  
  1802.  
  1803.  
  1804.  
  1805.  
  1806.  
  1807.  
  1808.  
  1809.  
  1810.  
  1811.  
  1812.  
  1813.  
  1814.  
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.                                                                      27
  1851.  
  1852.       XIII. Execution of Assembled Programs
  1853.  
  1854.       A. Object code format
  1855.  
  1856.          The object code file produced by CHASM is in the form of a
  1857.          memory image, exactly as will be present in your computer at
  1858.          run time.  No link step is required.  Provided that the segment
  1859.          registers are set correctly, the architecture of the 8088
  1860.          guarantees that code is self-relocating, and will run correctly
  1861.          loaded anywhere in memory.  Storing a program as an exact image
  1862.          of memory at run time is called the COM format by IBM.
  1863.  
  1864.          This COM format is *not* that produced by the IBM assembler.
  1865.          The output of the IBM assembler is in the form of an "object
  1866.          module" suitable for input to the linker.  To the best of my
  1867.          knowledge, the object module is not directly executable, but
  1868.          must first be "filtered" through the linker.  This adds an
  1869.          extra step to the process of producing a working program, but
  1870.          gives you the option of combining multiple object modules into
  1871.          one program.  The resulting linked program is *still* not a
  1872.          memory image, but has a header which is used to perform
  1873.          relocation during loading.  This linked program plus header is
  1874.          called the EXE format by IBM.
  1875.  
  1876.       B. Running Assembled Programs From DOS
  1877.  
  1878.          DOS provides a loader for running machine language programs.
  1879.          To run a program, you merely type its name, with or without
  1880.          the extension.  This is what you're doing every time you use a
  1881.          DOS external command such as FORMAT or CHKDSK.  In fact, the
  1882.          COM format is named after "external COMmand".
  1883.  
  1884.          When you type the name, DOS examines the file extension to
  1885.          determine what format the file is in, either COM or EXE.  This
  1886.          is why CHASM defaults to using the extension .com for your
  1887.          object file.  If you plan to run the program from DOS, don't
  1888.          change the extension.
  1889.  
  1890.          For COM programs, DOS builds a 255 byte long "program segment
  1891.          prefix" and sets the segment registers to point to this PSP.
  1892.          The contents of the file are then loaded verbatim right after
  1893.          the PSP, at offset hex 100 in the segment defined by the
  1894.          segment registers.  As soon as loading is complete, your
  1895.          program is executed starting with the instruction at hex 100.
  1896.  
  1897.  
  1898.  
  1899.  
  1900.  
  1901.  
  1902.  
  1903.  
  1904.  
  1905.  
  1906.  
  1907.  
  1908.  
  1909.  
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.                                                                      28
  1917.  
  1918.          Although you can totally ignore the PSP, you should read pages
  1919.          E-3 through E-11 of the DOS manual to see what DOS puts there
  1920.          for you.  It turns out there are some real goodies which your
  1921.          program might want to use.
  1922.  
  1923.          When your program is done, it must transfer control back to
  1924.          DOS, otherwise the 8088 will continue to fetch what it
  1925.          believes are instructions from whatever garbage or bit-hash
  1926.          happens to follow your program in memory.  The easiest way to
  1927.          return to DOS is to execute the instruction:
  1928.  
  1929.            INT 20H
  1930.  
  1931.          This is the vectored interrupt reserved by DOS for program
  1932.          termination.
  1933.  
  1934.          While we're on the topic of vectored interrupts, you would be
  1935.          well rewarded to study both the DOS manual and Technical
  1936.          Reference to find out what happens when you execute some of
  1937.          the other interrupts.  Some very useful functions, such as
  1938.          file handling and screen i/o, are available at the machine
  1939.          language level through this mechanism.
  1940.  
  1941.          Looking at things the other way, by changing the interrupt
  1942.          vector for a given function to point to your own code, you can
  1943.          override the way DOS or the BIOS does something, and do it
  1944.          your way.  DOS even provides a method (via interrupt 27H) by
  1945.          which your new code can be grafted onto DOS, and not be
  1946.          overwritten by other programs.
  1947.  
  1948.       C. Debugging Assembled Programs
  1949.  
  1950.          IBM provides an excellent utility with DOS, called DEBUG.COM.
  1951.          By specifying your program's name as a parameter when invoking
  1952.          DEBUG, you can observe your program execute with DEBUG's trace
  1953.          and other functions.  To debug your program, from DOS type:
  1954.  
  1955.             DEBUG progname.COM
  1956.  
  1957.          DEBUG builds a PSP and loads your program just like DOS does,
  1958.          but you have the added power of the debugging commands to
  1959.          monitor your program while it runs.  See chapter 6 of the DOS
  1960.          manual for more details about using DEBUG.
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966.  
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.                                                                      29
  1983.  
  1984.       D. Using Assembled Programs in BASIC
  1985.  
  1986.          To incorporate a machine language subroutine in a BASIC
  1987.          program, write it in assembly language, then assemble it with
  1988.          CHASM.  You should read page C-7 of the BASIC manual for some
  1989.          conventions to use in writing your subroutine.  In particular,
  1990.          note that you must declare the routine to CHASM as a FAR
  1991.          procedure using the PROC pseudo-op, and that the last
  1992.          instruction of the routine should be a RET.
  1993.  
  1994.          Unlike programs which are run directly from DOS, your routine
  1995.          will not be preceded by a program segment prefix.  You should
  1996.          prevent CHASM from leaving room for a PSP by putting an ORG 0
  1997.          pseudo-op at the beginning of your routine. If you don't
  1998.          include the ORG, memory references will not be assembled
  1999.          correctly.  Example:
  2000.  
  2001.               ORG  0    ;no psp
  2002.          SUBR PROC FAR  ;far procedure
  2003.               ...       ;body of subroutine
  2004.               RET
  2005.               ENDP
  2006.  
  2007.          CHASM supports two methods for getting assembled routines into
  2008.          BASIC programs.  The methods differ in whether the routine is
  2009.          included in the BASIC program file, or in a separate file.
  2010.  
  2011.          To include the code within a BASIC program file, run it
  2012.          through the utility COM2DATA, supplied on your CHASM disk.
  2013.          COM2DATA reads in a .COM format file, and produces a file of
  2014.          equivalent DATA statements which can be merged into a BASIC
  2015.          program. Your program can then READ the data and POKE it into
  2016.          memory.  An example program to do this is given on page C-6 of
  2017.          the BASIC manual.  An alternative approach would be to store
  2018.          the routine in a string variable, which could later be located
  2019.          with the VARPTR function. 
  2020.  
  2021.          If you would prefer to keep your machine language subroutine
  2022.          in a separate file, include a BSAVE pseudo-op somewhere within
  2023.          your assembly language source code.  CHASM will build a header
  2024.          on the object code produced, which will mimic that built by
  2025.          BASIC's BSAVE command.  The resulting file may be BLOADed by
  2026.          BASIC anywhere in memory.
  2027.  
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039.  
  2040.  
  2041.  
  2042.  
  2043.  
  2044.  
  2045.  
  2046.  
  2047.  
  2048.                                                                      30
  2049.  
  2050.          You transfer control to your routine with either the USR
  2051.          function, or the CALL statement.  Syntax for these statements
  2052.          can be found in the BASIC manual.
  2053.  
  2054.  
  2055.  
  2056.  
  2057.  
  2058.  
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.  
  2108.  
  2109.  
  2110.  
  2111.  
  2112.  
  2113.  
  2114.                                                                      31
  2115.  
  2116.       XIV. Notes for Those Upgrading to This Version of Chasm.
  2117.  
  2118.       Chasm is not yet cast in stone - improvements and corrections are
  2119.       made fairly frequently, based on both my own experience in using
  2120.       the program, and the comments of outside users.  This section
  2121.       summarizes the changes which have been made since version 1.2 was
  2122.       released.
  2123.  
  2124.       Version     Notes
  2125.  
  2126.       2.10        Equated symbols are now allowed in the DB operand
  2127.                   list.  The status line now gives more information,
  2128.                   and error messages are optionally accompanied by a
  2129.                   warning 'beep'.
  2130.  
  2131.       2.09        To resolve a syntactic ambiguity, the first digit of
  2132.                   hexadecimal constants must now be in the range 0-9.
  2133.                   A leading zero is now permitted on four digit hex
  2134.                   constants, to allow fufilling this condition.  Note
  2135.                   that this change could invalidate programs written
  2136.                   under earlier versions of CHASM.
  2137.  
  2138.       2.08        Configuration process expanded.  CHASM now skips over
  2139.                   perforations on printed listings.  EJECT pseudo-op
  2140.                   added.
  2141.  
  2142.       2.07        Oops.  Configuration file now works as advertised.
  2143.  
  2144.       2.06        CHASM now supports reverse long jumps.  The
  2145.                   admonition in earlier versions against reverse long
  2146.                   jumps was an error.
  2147.  
  2148.       2.05        A compiled version is now available as a free upgrade
  2149.                   to contributors of $20 or more.  A new pseudo-op,
  2150.                   BSAVE, was added for creation of BLOADable files for
  2151.                   use with BASIC.  CHASM now supports use of a
  2152.                   configuration file to set up a printer.  Finally,
  2153.                   CHASM.DAT was compacted for faster loading.
  2154.  
  2155.       2.04        TABs are now expanded and replaced with blanks, for
  2156.                   compatibility with IBM text editors.
  2157.  
  2158.  
  2159.  
  2160.  
  2161.  
  2162.  
  2163.  
  2164.  
  2165.  
  2166.  
  2167.  
  2168.  
  2169.  
  2170.  
  2171.  
  2172.  
  2173.  
  2174.  
  2175.  
  2176.  
  2177.  
  2178.  
  2179.  
  2180.                                                                      32
  2181.  
  2182.       2.03        Two bugs corrected.  The first bug involved incorrect
  2183.                   assembly of indirect memory references which used a
  2184.                   displacement in the range 128-255.  The second bug
  2185.                   caused a program crash if a hex number longer than 4
  2186.                   digits was in found in the input file.  This
  2187.                   situation now causes an error message to be printed,
  2188.                   and assembly continues.
  2189.  
  2190.       2.01        The utility COM2DATA was added to the CHASM
  2191.                   distribution package as an aid to including machine
  2192.                   language subroutines in BASIC programs.
  2193.  
  2194.       2.00        Corrected a bug in the DS and DB pseudo-ops which
  2195.                   caused the last label in a program to be redefined as
  2196.                   a memory location, whether it was intended to be one
  2197.                   or not.  Also, the TAB character was added as a new
  2198.                   delimiter, and a 20 page introductory primer was
  2199.                   added to the CHASM distribution package.
  2200.  
  2201.       1.9         The short jump is now represented with mnemonic JMPS,
  2202.                   for compatibility with DEBUG version 1.1.  Note that
  2203.                   this could invalidate programs written under earlier
  2204.                   versions of CHASM, which used mnemonic JP for this
  2205.                   instruction.
  2206.  
  2207.       1.8         The operand type "character" was added as a new way
  2208.                   to represent immediate data.  A single character
  2209.                   enclosed in single quotes (') is equivalent to the
  2210.                   numeric value of the ASCII code for the character.
  2211.                   See section V-1-E of this document for details.
  2212.  
  2213.       1.7         The DS operator now works for blocks larger than 255
  2214.                   bytes.  To keep the listing under control, object
  2215.                   code generated by DS is no longer shown on the
  2216.                   listing.  Also, the OFFSET function now works
  2217.                   properly in the displacement field of an indirect
  2218.                   memory reference.
  2219.  
  2220.       1.6         A revision of this document.  Some sections were
  2221.                   improved slightly, and in response to user requests,
  2222.                   a section on execution of assembled programs was
  2223.                   added.
  2224.  
  2225.  
  2226.  
  2227.  
  2228.  
  2229.  
  2230.  
  2231.  
  2232.  
  2233.  
  2234.  
  2235.  
  2236.  
  2237.  
  2238.  
  2239.  
  2240.  
  2241.  
  2242.  
  2243.  
  2244.  
  2245.  
  2246.                                                                      33
  2247.  
  2248.       1.5         Corrected an error which generated the message "Data
  2249.                   too Long" if the value FFH was used as 8 bit
  2250.                   immediate data.
  2251.  
  2252.       1.4         User interface improved.  Chasm now traps some common
  2253.                   input errors such as misspelling a file name, or
  2254.                   forgetting to turn on your printer, giving you a
  2255.                   second chance rather than just crashing.
  2256.  
  2257.       1.3         A speed enhancement.  Version 1.3 benchmarks about 5
  2258.                   times faster than version 1.2.
  2259.  
  2260.       As can be seen, revisions are made on a regular basis.  It is my
  2261.       policy that after once contributing, users are entitled to all
  2262.       future versions free of charge, with no further donation
  2263.       expected. Contributing users are encouraged to send a disk and
  2264.       return mailer from time to time, to receive the most current
  2265.       version. Major improvements will be announced in IPCO INFO and
  2266.       Programmer's Journal.
  2267.  
  2268.  
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  
  2305.  
  2306.  
  2307.  
  2308.  
  2309.  
  2310.  
  2311.  
  2312.                                                                      34
  2313.  
  2314.       XV. Miscellaneous and A Word From Our Sponsor...
  2315.  
  2316.       A. System Requirements:
  2317.  
  2318.          CHASM requires an 80 column display and at least one
  2319.          disk drive.  Under DOS 1.1, 64K of memory is required.
  2320.          DOS 2.0 users should have a minimum of 96K.
  2321.  
  2322.       B. Programming Notes:
  2323.  
  2324.          1. CHASM is written in BASIC.  If you have the compiled
  2325.             version, the source code is available free of charge - just
  2326.             send a disk and stamped return mailer. The program is
  2327.             heavily commented and very modular, so that if you'd like
  2328.             to see how an assembler works, you should read the source
  2329.             listing. CHASM's modular structure makes modification
  2330.             relatively easy, if you'd like to customize.  I'd like to
  2331.             hear about any improvements people make, for possible
  2332.             inclusion in future releases.
  2333.  
  2334.          2. If you do try to modify CHASM, there is a quirk you should
  2335.             know about.  Most of the initialization code is in a
  2336.             "transient section" which is used once, then deleted to
  2337.             make more room for the symbol table.  Lines 50,000 - 65529
  2338.             are reserved as this transient section.  Note Well: If you
  2339.             run CHASM, then save it to disk, you  save the program
  2340.             WITHOUT THE INITIALIZATION CODE. The resulting program is
  2341.             non-functional. Be careful!  Keep a backup.
  2342.  
  2343.       C. Red Tape and Legal Nonsense:
  2344.  
  2345.          1. Disclaimer:
  2346.  
  2347.             CHASM is distributed as is, with no guarantee that it will
  2348.             work correctly in all situations.  In no event will the
  2349.             Author be liable for any damages, including lost profits,
  2350.             lost savings or other incidental or consequential damages
  2351.             arising out of the use of or inability to use these
  2352.             programs, even if the Author has been advised of the
  2353.             possibility of such damages, or for any claim by any other
  2354.             party.
  2355.  
  2356.  
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363.  
  2364.  
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.  
  2374.  
  2375.  
  2376.  
  2377.  
  2378.                                                                      35
  2379.  
  2380.             Despite the somewhat imposing statement above, it *is* my
  2381.             intention to fix any bugs which are brought to my
  2382.             attention. Drop me a line if you think you've found a
  2383.             problem.
  2384.  
  2385.          2. Copyright Information:
  2386.  
  2387.             The entire CHASM distribution package, consisting of the
  2388.             main program, documentation files, and various data and
  2389.             utility files, is copyright (c) 1983 by David Whitman.  The
  2390.             author reserves the exclusive right to distribute this
  2391.             package, or any part thereof, for profit.  The name "CHASM
  2392.             (tm)", applied to a microcomputer assembler program, is a
  2393.             trade mark of David Whitman.
  2394.  
  2395.             The package consisting of UNCOMPILED program source code
  2396.             and the various subsidiary files may be copied freely by
  2397.             individuals for evaluation purposes.  It is expected that
  2398.             those who find the package useful will make a contribution
  2399.             directly to the author of the program.
  2400.  
  2401.             THE AUTHOR RESERVES THE EXCLUSIVE RIGHT TO DISTRIBUTE THIS
  2402.             PROGRAM IN COMPILED FORM.  UNAUTHORIZED DUPLICATION OR
  2403.             DISTRIBUTION OF A COMPILED VERSION OF THIS PROGRAM IS
  2404.             PUNISHABLE BY LAW.
  2405.  
  2406.  
  2407.       D. An Offer You Can't Refuse.
  2408.  
  2409.          CHASM is distributed under a modification of the FREEWARE (tm)
  2410.          marketing scheme, developed by Andrew Fluegelman, author of
  2411.          PC-TALK, whose efforts are gratefully acknowledged.
  2412.  
  2413.          Anyone may obtain a free copy of a relatively slow,
  2414.          but full featured, interpreted version of the program by
  2415.          sending a blank, formatted diskette to the author.  An
  2416.          addressed, postage-paid return mailer must accompany the disk
  2417.          (no exceptions, please).
  2418.  
  2419.  
  2420.  
  2421.  
  2422.  
  2423.  
  2424.  
  2425.  
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.  
  2432.  
  2433.  
  2434.  
  2435.  
  2436.  
  2437.  
  2438.  
  2439.  
  2440.  
  2441.  
  2442.  
  2443.  
  2444.                                                                      36
  2445.  
  2446.          A copy of the program, with documentation, will be sent by
  2447.          return mail.  The program will carry a notice suggesting
  2448.          a contribution to the program's author.  Making a contribution
  2449.          is totally voluntary on the part of the user.  Regardless of
  2450.          whether a contribution is made, the user is encouraged to
  2451.          share the program with others.  Payment for use is
  2452.          discretionary on the part of each subsequent user.
  2453.  
  2454.       The underlying philosophy here is based on three principles:
  2455.  
  2456.       First, that the value and utility of software is best assessed by
  2457.          the user on his/her own system.  Only after using a program
  2458.          can one really determine whether it serves personal
  2459.          applications, needs, and tastes.
  2460.  
  2461.       Second, that the creation of independent personal computer
  2462.          software can and should be supported by the computing
  2463.          community.
  2464.  
  2465.       Finally, that copying and networking of programs should be
  2466.          encouraged, rather than restricted.  The ease with which
  2467.          software can be distributed outside traditional commercial
  2468.          channels reflects the strength, rather than the weakness, of
  2469.          electronic information.
  2470.  
  2471.       Those who elect to make a contribution become eligible to
  2472.       receive a free upgrade to a compiled version of the program. The
  2473.       compiled version is functionally equivalent to the interpreted
  2474.       version, but executes much faster.  An order form for the
  2475.       compiled version is included at the end of this document.
  2476.  
  2477.       The compiled version is copyrighted, and users are requested NOT
  2478.       to make copies other than for their own use.  I am strongly
  2479.       opposed to copy protection, and would regret being forced to
  2480.       protect CHASM.  Please recognize the amount of time and money
  2481.       which went into producing CHASM, and respect the author's wishes
  2482.       in this matter.
  2483.  
  2484.       David Whitman
  2485.       2 North Park St. Apartment L
  2486.       Hanover, NH 03755
  2487.       (603) 643-2115
  2488.  
  2489.  
  2490.  
  2491.  
  2492.  
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.                                                                      37
  2511.  
  2512.            ********COMPILED VERSION ORDER FORM********
  2513.  
  2514.       Please copy CHASM version 3.0 onto the enclosed formatted disk. I
  2515.       enclose a self-addressed, stamped mailer.  I understand that this
  2516.       compiled version of CHASM is copyrighted, and agree not to
  2517.       distribute any unauthorized copies.
  2518.  
  2519.       My diskette is formatted:
  2520.  
  2521.          __ single sided, no DOS
  2522.  
  2523.          __ doubled sided (DOS optional)
  2524.  
  2525.       Disks may be formatted under either DOS 1.1 or 2.0
  2526.  
  2527.       Please check one:
  2528.  
  2529.          __ I enclose a donation of $20 or more.
  2530.  
  2531.          __ I am a past contributor of $20 or more.
  2532.  
  2533.  
  2534.       I heard about CHASM from:
  2535.  
  2536.       __ PC World     __ Programmer's Journal    __ Softalk/IBM
  2537.  
  2538.       __ IPCO Info    __ Other:_______________________________________
  2539.  
  2540.  
  2541.       Name:    _______________________________________________________
  2542.  
  2543.       Address: _______________________________________________________
  2544.  
  2545.       City, State, Zip: ______________________________________________
  2546.  
  2547.       ================================================================
  2548.       Send order form, along with disk, return mailer and check to:
  2549.  
  2550.                            David Whitman
  2551.                            2 N. Park St. Apartment L
  2552.                            Hanover, NH 03755
  2553.  
  2554.       Your order will be expedited if you mark your envelope:
  2555.                      "VERSION 3.0 UPGRADE"
  2556.       ================================================================
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.  
  2570.  
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.  
  2579.  
  2580.  
  2581.  
  2582.  
  2583.  
  2584.  
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598.  
  2599.  
  2600.  
  2601.  
  2602.  
  2603.  
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609.  
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.  
  2616.  
  2617.  
  2618.  
  2619.  
  2620.  
  2621.  
  2622.  
  2623.  
  2624.  
  2625.  
  2626.  
  2627.  
  2628.  
  2629.  
  2630.  
  2631.  
  2632.  
  2633.  
  2634.  
  2635.  
  2636.  
  2637.  
  2638.  
  2639.  
  2640.  
  2641.